﻿package com.snzflash.data 
{
	import com.snzflash.IDestroyable;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	/**
	 * Парсер данных для CMS Арсения Ряжского
	 * @author firsoff maxim, tel: +79222345364, skype: maxim.firsoff
	 */
	public class IhouseCMS extends EventDispatcher implements IDestroyable
	{
		// 
		public var banNames:Array = [];
		// домен
		public var site:String = '/';
		// папка с данными
		protected var dataFolder:String = 'cms/data/';
		protected var imagesPrefix:String = 'images/';
		protected var thumbPrefix:String = 'thumbnails/';
		
		// загрузчик
		protected var _loader:URLLoader;
		// удаленный адрес
		protected var _url:String;
		// сырые данные
		protected var _rawData:Object;
		// секции
		protected var _sections:Array;
		// отключенные секции
		protected var _banSections:/**/Array
		
		
		public function IhouseCMS() 
		{
			
		};
		
		public function load(url:String):void 
		{
			_url = url;
			_banSections = new Array();
			_sections = new Array();
			clearLoader();
			_loader = new URLLoader(new URLRequest(url));
			_loader.addEventListener(Event.COMPLETE, onLoad);
			_loader.addEventListener(IOErrorEvent.IO_ERROR, onError);
		};
		
		public function destroy():void 
		{
			clearLoader();
			_loader.removeEventListener(Event.COMPLETE, onLoad);
			_loader.removeEventListener(IOErrorEvent.IO_ERROR, onError);
		};
		
		protected function clearLoader():void
		{
			if (_loader)
			{
				try {_loader.close();}
				catch (err:Error) { };
			}
		};
		
		/**
		 * Разбор 1 секции
		 * @param	section
		 * @return
		 */
		protected function parseSection(section:SectionVO):void
		{
			// XML данные секции
			var data:XML = XML(section.data);
			// XML данные подсекции
			var subs_data: XML;
			// колво подсекций
			var num_subsections:int = data.section.length();
			// счетчик подсекций
			var counter:int = 0;
			// подсекция
			var subsection:SectionVO;
			
			// обработка контента
			parseContent(section);
			
			// обработка подсекций
			while (counter < num_subsections) 
			{
				subs_data = data.section[counter];
				// создаем подсекцию
				subsection = createSection(subs_data, section);
				// рекурсивная обработка под секции
				parseSection(subsection);
				// сохраняем подсекцию
				if(subsection.status == '1') section.addSection(subsection);
				counter++; // счетчик плюсом!
			};
		};
		
		/**
		 * Создание единичной секции
		 * 
		 * внимание - полн
		 * @param	data
		 * @return
		 */
		protected function createSection(data:Object, parentSection:SectionVO):SectionVO
		{
			var section:SectionVO = new SectionVO();
			section = new SectionVO();
			section.data = data;
			section.status = data.@status;
			section.name = data.@name;
			section.type = data.@type;
			section.description = data.@description;
			section.fullName = (parentSection ? parentSection.fullName : '')  + data.@name + '/';
			section.dataRootFolderURL = site + dataFolder + section.fullName;
			//if(parentSection)trace( (parentSection ? parentSection.fullName : '') + data.@name + '/');
			section.parent = parentSection;
			return section;
		}
		/**
		 * Разбор контента конечной секции ( конечной во всей рекурсии)
		 * @param	section
		 * @return
		 */
		protected function parseContent(section:SectionVO):Array
		{
			var items:/*ImageVO*/Array = new Array();
			var imageVO:ImageVO;
			for each(var c:XML  in section.data.content) 
			{
				imageVO = new ImageVO();
				imageVO.caption = c.@caption;
				imageVO.description = c.@description;
				imageVO.option = c.@option
				imageVO.name = c.@name;
				imageVO.info = c.@info;
				imageVO.full = site + dataFolder + section.fullName + imagesPrefix  + c.@name;
				imageVO.fullHeight =  c.@ih;
				imageVO.fullWidth =  c.@iw;
				imageVO.thumbnail = site + dataFolder + section.fullName + thumbPrefix + c.@thmbname;
				//trace(imageVO.thumbnail);
				imageVO.thumbnailHeight =  c.@th;
				imageVO.thumbnailWidth =  c.@tw;
				items.push(imageVO);
			};
			
			// TO DO: проверить!
			section.content = section.content.concat(items);
			return items;
		};
		
		/**
		 * Обработчик данных
		 * 
		 * Используется рекурсивный метод, т.к. заранее не известно, сколько уровней вложенности
		 * @param	data
		 */
		protected function parseData(data:XML):void
		{
			//trace(data.sections);
			var sectionVO:SectionVO;
			var subsectionVO:SectionVO;
			var imageVO:ImageVO;
			//trace('data.sections.section : ' + data.section);
			for each(var i:XML  in data.section ) 
			{
				sectionVO = createSection(i, null);
				parseSection(sectionVO);
				
				if (sectionVO.status == '1' && banNames.indexOf(sectionVO.name) == -1) 
				{ 
					_sections.push(sectionVO); 
				}
				else 
				{
					_banSections.push(sectionVO);
				};
			};
		};
		
		public function get rawData():Object { return _rawData; };
		
		public function get sections():/*SectionVO*/Array { return _sections; };
		
		public function getSectionByName(sectionName:String):SectionVO 
		{ 
			var sections_index:int
			for each(var i:SectionVO  in _sections) 
			{
				if (i.name == sectionName) return i;
			};
			
			for each(i in _banSections) 
			{
				if (i.name == sectionName) return i;
			};
			
			return null; 
		}
		
		protected function onError(event:IOErrorEvent):void 
		{
			trace('ERROR PARCER');
			//dispatchEvent(event.clone());
		};
		
		protected function onLoad(event:Event):void 
		{
			_rawData = _loader.data;
			
			// обработка данных
			parseData(XML(_rawData));
			dispatchEvent(event.clone());
		};
		
	}

}